/**
 * 自定义精度数学运算工具
 */

/**
 * 获取数字的小数位数
 * @param {number} num 
 * @returns {number} 小数位数
 */
function getDecimalPlaces(num) {
    try {
      return num.toString().split('.')[1].length;
    } catch (e) {
      return 0;
    }
  }
  
  /**
   * 处理精度问题的基础方法
   * @param {'add'|'sub'|'multiply'|'divide'} type 运算类型
   * @param  {...number} nums 要运算的数字
   * @returns {number} 运算结果
   */
  function operate(type, ...nums) {
    if (nums.length < 2) return nums[0] || 0;
    
    // 找出小数位数最多的数
    const maxDecimal = Math.max(...nums.map(num => getDecimalPlaces(num)));
    const factor = Math.pow(10, maxDecimal);
    
    // 将所有数字转为整数
    const intNums = nums.map(num => Math.round(num * factor));
    
    let result = intNums[0];
    for (let i = 1; i < intNums.length; i++) {
      switch (type) {
        case 'add':
          result += intNums[i];
          break;
        case 'sub':
          result -= intNums[i];
          break;
        case 'multiply':
          result *= intNums[i];
          factor *= factor; // 乘法需要调整因子
          break;
        case 'divide':
          if (intNums[i] === 0) throw new Error('Division by zero');
          result /= intNums[i];
          break;
        default:
          throw new Error('Unknown operation type');
      }
    }
    
    // 对于乘法和除法需要特殊处理
    if (type === 'multiply') {
      return result / Math.pow(factor, nums.length);
    } else if (type === 'divide') {
      return result;
    }
    
    return result / factor;
  }
  
  // 导出具体的运算方法
  export const preciseMath = {
    add: (...nums) => operate('add', ...nums),
    sub: (...nums) => operate('sub', ...nums),
    multiply: (...nums) => operate('multiply', ...nums),
    divide: (...nums) => operate('divide', ...nums),
    
    // 四舍五入到指定小数位
    round: (num, decimalPlaces = 2) => {
      const factor = Math.pow(10, decimalPlaces);
      return Math.round(num * factor) / factor;
    },
    
    // 比较两个数是否相等（考虑精度问题）
    equals: (a, b, tolerance = 0.000001) => {
      return Math.abs(a - b) < tolerance;
    }
  };